fix: Argon skin corruption + ppy cherry-pick + surface format + safe-mode shader wipe - #343
Merged
Merged
Conversation
…mode shader wipe Changes: - Cherry-pick ppy editor toolbox icons commit: new OsuIcon entries (EditorHit, EditorDrumRoll, EditorSwell, EditorFruit, EditorJuiceStream, EditorBananaShower, EditorNote, EditorHoldNote) and all 8 composition tools updated to use SpriteIcon instead of BeatmapStatisticIcon. Bump osu-resources to 2026.519.0. - Fix Argon skin visual corruption (white circles, off-hue TrianglesV2 on buttons): Force-wipe the shader pipeline cache in ForceOpenGLRendererIfSafeMode(). When a Vulkan session dies mid-compile (ANR), the shader cache sentinel is already marked 'done for v241' but partial/misaligned SPIR-V blobs remain on disk. The rescue OpenGL session then picks up these stale shaders which were compiled against the old GlobalUniformData layout (pre-UniformPadding12 alignment fix). Result: the masking uniform (CornerRadius clip) and gradient colour uniform are read from wrong struct offsets → Argon hit circles appear as white squares, button TrianglesV2 shows wrong hues. Wiping unconditionally on every safe-mode entry fixes this. - Make pre-SDL Window.SetFormat(RGBA8888) unconditional (remove IsVulkanConfigured guard). Ensures 32-bit colour in both Vulkan and OpenGL modes; prevents an RGB565 initial surface allocation that causes colour-channel artefacts in early frames of the OpenGL rescue session. Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/aff86d54-a6b0-494c-b672-682c2bfbd9ff Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
winnerspiros
May 19, 2026 20:53
View session
winnerspiros
approved these changes
May 19, 2026
Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/e20f5f4d-6cae-4655-808b-9f6bda1c985e Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/ad643f8c-cd6e-4da3-b81a-5821e16c4552 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 20, 2026
…per-dash colour tests Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/4ce2919b-353e-4a49-9712-a665dd5f72a9 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 20, 2026
…itExplosion null Drawable, fix iOS xcode-select Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/04bea131-bdfb-4c81-8a1a-dbba5215f82e Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 21, 2026
…le properly nullable Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/f25219ac-7425-4cf9-b931-f7cf70266b1d Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 21, 2026
…sources (hasPear=true) TestSkin was using null resource store, causing CatchLegacySkinTransformer to see hasPear=false and return null for the fruit component. This caused SkinnableDrawable to fall back to DefaultFruitPiece, which always uses DEFAULT_HYPER_DASH_COLOUR regardless of skin config. Fix: implement IStorageResourceProvider in the test scene and pass it to TestSkin, which now uses a NamespacedResourceStore pointing to the built-in legacy skin assets (Skins/Legacy). This makes hasPear=true, returning LegacyFruitPiece, which correctly reads hyper-dash colours from skin config. Also fix iOS CI workflow: resolve MacOSX.sdk symlink target to its canonical path (via python3 os.path.realpath) to prevent ELOOP (too many symlink levels) when the symlink target is itself a symlink chain. Agent-Logs-Url: https://github.com/winnerspiros/osu/sessions/18bebe86-a7b2-4d08-815c-3cad3370ec69 Co-authored-by: winnerspiros <1675249+winnerspiros@users.noreply.github.com>
winnerspiros
approved these changes
May 21, 2026
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Updates framework dependencies and editor UI icons, while adding Android stability mitigations and adjusting CI Xcode selection for updated .NET iOS tooling.
Changes:
- Bump
ppy.osu.Framework(and mobile variants) to2026.520.3, and updateppy.osu.Game.Resources. - Add new editor icon mappings and switch multiple ruleset composition tools to use
OsuIcon-basedSpriteIcons. - Add Android Vulkan ANR mitigation (OnPause watchdog) + safe-mode shader-cache wipe, and update CI to select Xcode 26.5.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
osu.iOS.props |
Bumps iOS framework package version. |
osu.Game/osu.Game.csproj |
Bumps framework package, updates referenced version in comment, bumps resources package. |
osu.Game/Graphics/OsuIcon.cs |
Adds new editor icon public accessors + enum mappings for new glyphs. |
osu.Game.Rulesets.Taiko/UI/KiaiHitExplosion.cs |
Makes skinnable nullable and guards lifetime accessors. |
osu.Game.Rulesets.Taiko/Edit/SwellCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Taiko/Edit/HitCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Taiko/Edit/DrumRollCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Mania/Edit/NoteCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Mania/Edit/HoldNoteCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Catch/Edit/JuiceStreamCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Catch/Edit/FruitCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Catch/Edit/BananaShowerCompositionTool.cs |
Switches tool icon to SpriteIcon using new OsuIcon. |
osu.Game.Rulesets.Catch.Tests/TestSceneHyperDashColouring.cs |
Updates test skin to use storage/resource plumbing via IStorageResourceProvider. |
osu.Android/OsuGameActivity.cs |
Improves window format setup comments and adds Vulkan-only OnPause watchdog to avoid ANRs. |
osu.Android/LogManagement.cs |
Wipes shader cache on safe-mode OpenGL rescue path to avoid corruption after interrupted Vulkan compile. |
osu.Android.props |
Bumps Android framework package version. |
.github/workflows/ci.yml |
Updates Xcode pinning logic to 26.5 and symlinks real macOS SDK into the active Xcode. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+999
to
+1032
| if (LogManagement.IsVulkanConfigured()) | ||
| { | ||
| var pauseCompleted = new ManualResetEventSlim(false); | ||
|
|
||
| ThreadPool.QueueUserWorkItem(_ => | ||
| { | ||
| const int watchdog_ms = 7000; | ||
|
|
||
| if (pauseCompleted.Wait(watchdog_ms)) | ||
| return; | ||
|
|
||
| // base.OnPause() has not returned — draw thread is conclusively stuck in | ||
| // vkQueuePresentKHR. Write a diagnostic marker and kill cleanly. | ||
| try | ||
| { | ||
| CrashDiagnostics.WriteAliveMarker( | ||
| $"OnPause watchdog fired after {watchdog_ms}ms: draw thread stuck in vkQueuePresentKHR (Vulkan IMMEDIATE ANR). Killing for clean restart."); | ||
| } | ||
| catch { } | ||
|
|
||
| try | ||
| { | ||
| Debug.WriteLine( | ||
| "[osu!] OnPause watchdog: draw thread stuck in vkQueuePresentKHR >7s — killing for clean Vulkan restart."); | ||
| } | ||
| catch { } | ||
|
|
||
| try { global::Android.OS.Process.KillProcess(global::Android.OS.Process.MyPid()); } | ||
| catch { } | ||
| }); | ||
|
|
||
| base.OnPause(); | ||
| pauseCompleted.Set(); | ||
| } |
Comment on lines
+230
to
+235
| IRenderer IStorageResourceProvider.Renderer => host.Renderer; | ||
| AudioManager IStorageResourceProvider.AudioManager => Audio; | ||
| IResourceStore<byte[]> IStorageResourceProvider.Files => null!; | ||
| IResourceStore<byte[]> IStorageResourceProvider.Resources => base.Resources; | ||
| IResourceStore<TextureUpload> IStorageResourceProvider.CreateTextureLoaderStore(IResourceStore<byte[]> underlyingStore) => host.CreateTextureLoaderStore(underlyingStore); | ||
| RealmAccess IStorageResourceProvider.RealmAccess => null!; |
Comment on lines
+435
to
+443
| [Description(@"Editor/banana-shower")] | ||
| EditorBananaShower, | ||
|
|
||
| [Description(@"Editor/note")] | ||
| EditorNote, | ||
|
|
||
| [Description(@"Editor/hold-note")] | ||
| EditorHoldNote, | ||
|
|
Comment on lines
+316
to
+322
| # Switch to preferred Xcode if it exists, otherwise the one that has the real SDK. | ||
| if [ -d "$PREFERRED_XCODE" ]; then | ||
| sudo xcode-select -switch "$PREFERRED_XCODE" | ||
| elif [ -n "$REAL_XCODE" ]; then | ||
| sudo xcode-select -switch "$REAL_XCODE" | ||
| echo "Note: Xcode_26.5.app not found; using $REAL_XCODE for xcode-select" | ||
| fi |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.